package jinzhi1.binary.binary.lib;

import java.util.ArrayList;
import java.util.List;

//二进制
public class Bin extends Binary {
    private  String bin;
    public Bin(String bin) {
        this.bin=bin;
    }

    /*
    函数：二进制转换二进制
    转换原理：
        二进制等于二进制；
     */
    @Override

  public String toBin() {
        return bin;
    }

    /*
    函数：二进制转换十进制
    转换原理：
        1.获取的数字从左到右乘2^n-1叠加算出结果
        // 1011
        // (1*2^3)+ (0*2^2)+(1*2^1)+(1*2^0)
     */
    @Override
    public long toDec() {
        long dec = 0;
        for (int i = 0; i < bin.length(); i++) {
            int x = Integer.valueOf(bin.substring(i,i+1));
            dec +=x*pingFang(2,bin.length()-i-1);
        }
        return dec;
    }

    /*
    函数：二进制转换八进制
    原理：
       1. 将二进制数字分成每三个一组
       2. 对每一组数字进行转换
       3.将转换后的结果连接起来
        (101101)
        (1*2^0+0*2^1+1*2^2)+(1*2^0+0*2^1+1*2^2)
        （1*1+0*2+1*4）+
        55
     */
    @Override
   public long toOct() {
        String oct = "";
        String str = bin;
        int index = 0;
        StringBuffer sb = new StringBuffer(str);
        while (!(sb.length() % 3 == 0)) {
            sb.insert(0, "0");
        }
        System.out.println(sb);
        for (int i = 0; i < sb.length(); i=i+3) {
            String dd = sb.substring(i,i+3);
            int dec = 0;
            for (int j = 0; j < dd.length(); j++) {
                int x = Integer.valueOf(dd.substring(j,j+1));
                dec +=x*pingFang(2,dd.length()-j-1);
            }
            oct += dec;
        }
        return Long.parseLong(oct);
   }

/*
    函数：二进制转换16进制
    原理：
        1. 将二进制数字分成每四个一组
       2. 对每一组数字进行转换
       3.判断是否大于9，大于9换成相对数字
       3.将转换后的结果连接起来
 */
    @Override
   public String toHex() {
        String hex="";
        String str = bin;
        int index = 0;
        StringBuffer sb = new StringBuffer(str);
        while (!(sb.length() % 4 == 0)) {
            sb.insert(0, "0");
        }
        System.out.println(sb);
        for (int i = 0; i < sb.length(); i=i+4) {
            String dd = sb.substring(i,i+4);
            int dec = 0;
            for (int j = 0; j < dd.length(); j++) {
                int x = Integer.valueOf(dd.substring(j,j+1));
                dec +=x*pingFang(2,dd.length()-j-1);
            }
            if (dec > 9) {
                hex += Character.toString((char) (dec + 55));
            } else {
                hex += Integer.toString(dec);
            }
        }
        return hex;
    }

    public long pingFang(long num,int p){
        long result = 1;
        for (int i = 0; i < p; i++) {
            result = result*num;
        }
        return result;
    }

}
